#include "TcpServer.hpp"
#include "ServerCal.hpp"
#include <memory>
#include <iostream>

ServerCal calculator;

void DefaultOnMessage(std::shared_ptr<Connection> connection_ptr)
{
    std::cout << "上层获取数据成功, data: " << connection_ptr->Inbuffer() << std::endl;
    std::string response_str = calculator.Handler(connection_ptr->Inbuffer());
    if (response_str.empty()) return;
    lg(Debug, "%s", response_str.c_str());

    // 发送回去
    connection_ptr->AppendOutBuffer(response_str);

    connection_ptr->_tcp_server_ptr->Sender(connection_ptr);

    // 我们如何正确理解发送？
    // 在 select/poll/epoll 中, 写事件经常是就绪的(因为发送缓冲区一般来说都是有空间的)
    // 如果我们对 EPOLLOUT 设置为关心, 那么在大部分情况下 EPOLLOUT 几乎都是就绪的
    // 这样就会导致 epollserver 经常返回, 从而导致浪费 CPU 资源
    // 因为上面的原因, 我们需要对读事件设置为总是关心, 而对写事件设置为按需关心 
    // 那我们怎么处理写事件呢？——直接写入, 如果写入完成就直接结束; 如果写入完成, 但是数据没有写完
    // 就说明 outbuffer 中还有内容, 此时就需要对写事件进行关心了! 如果写完了所有数据, 再去掉对写事件的关心
}

int main()
{
    std::unique_ptr<TcpServer> epoll_svr(new TcpServer(8080, DefaultOnMessage));
    epoll_svr->Init();
    epoll_svr->Loop();
    
    return 0;
}
